package citylife.geotools.demo.tianditu.mkt;

import java.net.URL;

import org.geotools.tile.Tile;
import org.geotools.tile.TileIdentifier;
import org.geotools.tile.TileService;
import org.geotools.tile.impl.WebMercatorTileFactory;
import org.geotools.tile.impl.ZoomLevel;

/**
 * The tile implementation for the tianditu family
 *
 */
public class TiandituTile extends Tile {

  public static final int DEFAULT_TILE_SIZE = 256;

  public TiandituTile(int x, int y, ZoomLevel zoomLevel, TileService service) {
    this(new TiandituTileIdentifier(x, y, zoomLevel, service.getName()), service);
  }

  public TiandituTile(TileIdentifier tileName, TileService service) {
    super(tileName, WebMercatorTileFactory.getExtentFromTileName(tileName), DEFAULT_TILE_SIZE, service);
  }

  @Override
  public URL getUrl() {
    /*
     * 注意点1：天地图的服务器地址随机数
     * 
     * 原计划使用随机数访问不同服务器，减轻服务器压力。
     * 但是，瓦片去重的机制设计url的比对。使用随机数会造成重复的瓦片不发被过滤，导致瓦片取得处理的逻辑发生异常。
     * 所以，随机数被默认为1。
     * 天地图的访问地址可以是t0~t7
     * 
     * 
     * 
     * 注意点2：天地图的{x}与{y}
     * 
     * 天地图的{x}代表：数据源的行row。
     * 天地图的{y}代表：数据源的列col。可以参考天地图的瓦片url中参数名进行理解
     * Geotools的瓦片的X代表：横轴方向的序号，对应天地图的某行上的第几列，既{y}
     * Geotools的瓦片的Y代表：纵轴方向的序号，对应天地图的某列上的第行列，既{x}
     * 所以填充天地图的瓦片url时，要调整{x}{y}和XY的对应关系
     * 
     */
    String url = this.service.getBaseUrl()
        .replace("{x}", "" + getTileIdentifier().getY())
        .replace("{y}", "" + getTileIdentifier().getX())
        .replace("{z}", "" + getTileIdentifier().getZ())
        .replace("{random7}", "1");
    try {
      return new URL(url);
    } catch (Exception e) {
      final String mesg = "Cannot create URL from " + url;
      throw new RuntimeException(mesg, e);
    }
  }
}